package com.app.util;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class PdfToImageUtil {
    /**
     * 转换PDF为图片
     *
     * @param pdfFile     PDF文件
     * @param outputDir   输出目录
     * @param imageFormat 图片格式(png/jpg等)
     * @param dpi         图片清晰度(建议144-300)
     * @return 生成的图片文件列表
     */
    public static List<File> convertPdfToImages(File pdfFile, String outputDir,
                                                String imageFormat, int dpi) throws IOException {
        // 检查并确保系统已安装所需中文字体
        checkChineseFonts();

        List<File> imageFiles = new ArrayList<>();

        try (PDDocument document = PDDocument.load(pdfFile)) {
            PDFRenderer renderer = new PDFRenderer(document);
            String baseName = getBaseName(pdfFile.getName());

            // 确保输出目录存在
            File outputDirFile = new File(outputDir);
            if (!outputDirFile.exists()) {
                outputDirFile.mkdirs();
            }

            for (int i = 0; i < document.getNumberOfPages(); i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                File outputFile = new File(outputDir,
                        baseName + "_" + (i + 1) + "." + imageFormat);
                ImageIO.write(image, imageFormat, outputFile);
                imageFiles.add(outputFile);
            }
        }
        return imageFiles;
    }

    private static String getBaseName(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
    }


    /**
     * 检查并确保系统已安装所需中文字体
     */
    private static void checkChineseFonts() {
        // 在Linux系统上，需要安装中文字体
        if (System.getProperty("os.name").toLowerCase().contains("linux")) {
            try {
                // 检查常见中文字体是否已安装
                Process process = Runtime.getRuntime().exec("fc-list :lang=zh");
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
                String line;
                boolean hasChineseFont = false;
                while ((line = reader.readLine()) != null) {
                    if (line.contains("SimSun") || line.contains("宋体") ||
                            line.contains("STSong") || line.contains("AdobeSong")) {
                        hasChineseFont = true;
                        break;
                    }
                }

                if (!hasChineseFont) {
                    System.err.println("警告：系统缺少中文字体，可能导致PDF转图片中文乱码");
                    System.err.println("请在Linux系统上安装中文字体，例如：");
                    System.err.println("1. 将simsun.ttf或simsun.ttc复制到/usr/share/fonts/目录");
                    System.err.println("2. 执行以下命令：");
                    System.err.println("   mkfontscale");
                    System.err.println("   mkfontdir");
                    System.err.println("   fc-cache -fv");
                }
            } catch (IOException e) {
                System.err.println("检查中文字体时出错：" + e.getMessage());
            }
        }
    }
}